package com.chenjun.designpattern.behavior.command;

/**
 * <p> 回调机制类结构背景：</p>
 * <p> Class A实现接口CallBack callback——背景1 </p>
 * <p> Class A中包含一个class B的引用b ——背景2 </p>
	<p>Class B有一个参数为callback的方法f(CallBack callback) ——背景3</p>
	<p>
	 * <p>我对回调机制的理解</p>
	 * “ don't call me  , I well call you ”这是著名的好莱坞原则
	 * 在高层次的类上面定义好类之间的方法的调用关系，利用面向对象多态性（运行期动态绑定）
	 * 让指向函数的指针在运行期指向具体的实现方法,具体可以参考C++动态联编
 * </p>
 * @author Administrator
 *
 */
public class 回调模式
{
	public static void main(String[] args)
	{
		/*************** 具体实现类调用方式 ******************************/
		/**
		 * 调用形式1
		 */
		Server1 s1 = new Server1();
		s1.setCallBackProcess(new Client());
		s1.task();

		/**
		 * 调用形式2
		 */
		Server2 s2 = new Server2();
		s2.task(new Client());

		/**************** 匿名内部类调用形式 *****************************/
		/**
		 * 调用形式3
		 */
		Server1 s3 = new Server1();
		s3.setCallBackProcess(new CallBackProcess()
		{
			@Override
			public void callback()
			{
				System.out.println("调用形式3 ");
			}
		});
		s3.task();

		/**
		 * 调用形式4
		 */
		new Server2().task(new CallBackProcess()
		{
			@Override
			public void callback()
			{
				System.out.println("调用形式4");
			}
		});
		
		/**
		 * 调用形式5  ————--和new Thread(new Runnable(){});形式一样的
		 */
		 new Server3(new CallBackProcess()
		{
			@Override
			public void callback()
			{
				System.out.println("调用形式5");
			}
		}).task();
	}
}

interface CallBackProcess
{
	public void callback();
}

class Client implements CallBackProcess
{
	@Override
	public void callback()
	{
		System.out.println("Client callback()");
	}
}

/**
 * 形式1
 * 
 * @author Administrator
 *
 */
class Server1
{
	private CallBackProcess callBackProcess;

	public void task()
	{
		callBackProcess.callback();
	}

	/**
	 * getter and setter
	 * 
	 * @return
	 */
	public CallBackProcess getCallBackProcess()
	{
		return callBackProcess;
	}

	public void setCallBackProcess(CallBackProcess callBackProcess)
	{
		this.callBackProcess = callBackProcess;
	}
}

/**
 * 形式2
 * 
 * @author Administrator
 *
 */
class Server2
{
	public void task(CallBackProcess callBackProcess)
	{
		callBackProcess.callback();
	}
}

class Server3
{
	private CallBackProcess callBackProcess;
	public Server3(CallBackProcess callBackProcess)
	{
		this.callBackProcess = callBackProcess;
	}
	public void task()
	{
		callBackProcess.callback();
	}
}

